vue0.11.9源码 src_instance_events.js
Last Updated:2023-08-04
inDoc
逻辑
源码在(src/util/dom.js#L19)[https://github.com/vuejs/vue/blob/0.11.9/src/util/dom.js#L19]
var doc =
typeof document !== 'undefined' &&
document.documentElement
exports.inDoc = function (node) {
var parent = node && node.parentNode
return doc === node ||
doc === parent ||
!!(parent && parent.nodeType === 1 && (doc.contains(parent)))
}
documentElement
在JavaScript中,documentElement是一个用于获取文档根元素的属性。文档根元素通常是HTML文档中的<html>元素,它是文档中所有元素的祖先元素
parentNode
在JavaScript中,parentNode是一个用于获取一个DOM节点的父节点的属性。每个DOM节点都有一个parentNode属性,指向该节点的直接父节点。
parentNode
和parentElement
在JavaScript中,parentNode和parentElement都是用于获取DOM节点的父级元素的属性,但它们之间有一些区别。
parentNode是一个包含所有类型的父节点的属性,包括元素节点、文本节点和注释节点等。如果当前节点没有父节点(例如,它是文档节点),则parentNode属性将返回null。
parentElement是一个只包含元素节点的父级元素的属性。如果当前节点没有父级元素(例如,它是文档节点或注释节点),则parentElement属性将返回null。
一般来说,如果我们只关心元素节点的父级元素,那么使用parentElement属性会更方便,因为它只返回元素节点的父级元素。但是,如果我们需要处理文本节点或注释节点等其他类型的节点,那么使用parentNode属性会更合适,因为它可以返回任何类型的父节点。
nodeType
在JavaScript中,nodeType是一个用于检查DOM节点类型的属性。每个DOM节点都有一个nodeType属性,它是一个整数值,表示该节点的类型。
以下是一些常见的DOM节点类型及其对应的nodeType值:
元素节点(element):1 属性节点(attribute):2 文本节点(text):3 注释节点(comment):8 文档节点(document):9 文档类型节点(document type):10
这里parent.nodeType === 1来判断是否是元素节点
dom contains
在JavaScript中,contains()方法是用来检查一个元素是否是另一个元素的后代。该方法接受一个参数,即要检查是否为后代的元素。如果指定的元素是当前元素的后代,则该方法返回true;否则,返回false。
_initEvents
代码定义
exports._initEvents = function () {
var options = this.$options
registerCallbacks(this, '$on', options.events)
registerCallbacks(this, '$watch', options.watch)
}
顺着registerCallbacks,最后register
函数实现
register
函数
如果注册的时候响应函数的入参是个函数的话,就直接'存'
如果是个字符串的话,就从methods
里头取出这个函数,再'存'
function register (vm, action, key, handler) {
var type = typeof handler
if (type === 'function') {
vm[action](key, handler)
} else if (type === 'string') {
var methods = vm.$options.methods
var method = methods && methods[handler]
if (method) {
vm[action](key, method)
} else {
_.warn(
'Unknown method: "' + handler + '" when ' +
'registering callback for ' + action +
': "' + key + '".'
)
}
}
}
register
函数里头核心的'存'逻辑->'$on'或者'$watch'
先只讨论'$on'逻辑
'$on'逻辑是在(src/api/events.js)[https://github.com/vuejs/vue/blob/0.11.9/src/api/events.js#L10]定义
总结起来就是this
下面的this._events
数组,将注册时候传入的回调函数推入这个数组里头
exports.$on = function (event, fn) {
(this._events[event] || (this._events[event] = []))
.push(fn)
modifyListenerCount(this, event, 1)
return this
}